/**
 * 程序运行结果说明：
 * 1. 若使用ET，一次输入只会触发一次POLLIN event，不管有没有把数据读走
 * 2. 若不使用ET，一次输入会导致不停地触发POLLIN event，刷屏输出"welcome to epoll's word!"
 * 3. 若不使用ET，但输入后把数据读走，则一次输入只会触发一次POLLIN event
 * 4. 若不使用ET，输入后一次只读走部分数据，则一次输入会触发多次POLLIN event，直到所有数据都被读走。例如：
 *  1234567
    welcome to epoll's word!
    welcome to epoll's word!
    12345678
    welcome to epoll's word!
    welcome to epoll's word!
    welcome to epoll's word!
 * 示例代码中，一次最多读取4个字符。"12345678"实际上共9个字节，最后一个字符是换行(LF)，所以需要3次才能全部读完。
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/epoll.h>

int main(void)
{
    int epfd,nfds;
    struct epoll_event ev,events[5];                    //ev用于注册事件，数组用于返回要处理的事件
    epfd = epoll_create(1);                                //只需要监听一个描述符——标准输入
    ev.data.fd = STDIN_FILENO;
    ev.events = EPOLLIN;                                //监听读状态同时设置LT模式
    epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev);    //注册epoll事件
    for(;;)
    {
        nfds = epoll_wait(epfd, events, 5, -1);
        for(int i = 0; i < nfds; i++)
        {
            if(events[i].data.fd==STDIN_FILENO)
            {
                char buf[4] = {0};
                read(STDIN_FILENO, buf, sizeof(buf));
                printf("welcome to epoll's word!\n");

            }            
        }
    }
}
